package com.dd.controller;

import javafx.fxml.FXML;
import javafx.scene.control.TableView;
import javafx.scene.control.TableColumn;
import javafx.scene.control.Button;
import javafx.scene.control.TableRow;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;

/*`FeedbackTaskListController` 是 JavaFX 应用中的一个控制器类，主要用于“待检测任务列表”页面的数据展示和交互。它的主要作用包括：

1. **加载和显示任务列表**：从 `aqi_data.json` 文件中读取待检测的任务（如省、市、日期、地址），并显示在 TableView 表格中。
2. **行选择与按钮联动**：只有选中表格中的某一行后，“去检测”按钮才会变为可用，防止用户误操作。
3. **跳转到检测页面**：点击“去检测”按钮后，会打开 AQI 检测页面（`aqi_detect.fxml`），并把选中的任务信息传递给检测页面的控制器（`AqiDetectController`）。
4. **数据解析**：内部类 `AqiTask` 用于解析 JSON 文件中的任务数据，并与表格进行数据绑定。

**总结**：  
这个类就是“待检测任务列表页面”的控制器，负责加载任务数据、展示任务列表、响应用户选择，并实现跳转到具体检测页面的功能。*/
public class FeedbackTaskListController {

    @FXML private TableView<AqiTask> tableView;
    @FXML private TableColumn<AqiTask, String> provinceCol;
    @FXML private TableColumn<AqiTask, String> cityCol;
    @FXML private TableColumn<AqiTask, String> dateCol;
    @FXML private TableColumn<AqiTask, String> addressCol;
    @FXML private Button detectButton;

    @FXML
    public void initialize() {
        provinceCol.setCellValueFactory(new PropertyValueFactory<>("province"));
        cityCol.setCellValueFactory(new PropertyValueFactory<>("city"));
        dateCol.setCellValueFactory(new PropertyValueFactory<>("date"));
        addressCol.setCellValueFactory(new PropertyValueFactory<>("address"));

        ObservableList<AqiTask> data = FXCollections.observableArrayList();
        try {
            InputStream inputStream = getClass().getResourceAsStream("/aqi_data.json");
            if (inputStream != null) {
                Gson gson = new Gson();
                List<AqiTask> list = gson.fromJson(new InputStreamReader(inputStream, "UTF-8"), new TypeToken<List<AqiTask>>(){}.getType());
                data.addAll(list);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        tableView.setItems(data);

        // 选中行才可点击"去检测"
        tableView.getSelectionModel().selectedItemProperty().addListener((obs, oldSel, newSel) -> {
            detectButton.setDisable(newSel == null);
        });

        // 可选：双击行或点击按钮处理检测逻辑
        detectButton.setOnAction(e -> {
            AqiTask selected = tableView.getSelectionModel().getSelectedItem();
            if (selected != null) {
                try {
                    FXMLLoader loader = new FXMLLoader(getClass().getResource("/com/dd/aqi_detect.fxml"));
                    Parent root = loader.load();
                    com.dd.controller.AqiDetectController controller = loader.getController();
                    controller.setTaskInfo(selected.getProvince(), selected.getCity(), selected.getAddress(), selected.getDate());
                    Stage stage = new Stage();
                    stage.setTitle("AQI检测");
                    stage.setScene(new Scene(root, 450, 500));
                    stage.setResizable(false);
                    stage.show();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        });
    }

    // 内部类用于Gson解析和TableView绑定
    public static class AqiTask {
        private String province;
        private String city;
        private String date;
        private String address;

        // Gson需要无参构造
        public AqiTask() {}

        public String getProvince() { return province; }
        public String getCity() { return city; }
        public String getDate() { return date; }
        public String getAddress() { return address; }

        // 兼容json字段
        public void setProvince(String province) { this.province = province; }
        public void setCity(String city) { this.city = city; }
        public void setDate(String date) { this.date = date; }
        public void setAddress(String address) { this.address = address; }
    }
} 